const path = require('path')

const isDev = process.env.NODE_ENV === 'development'

const VueLoaderPlugin = require('vue-loader/lib/plugin')
const HtmlWebpackplugin = require('html-webpack-plugin')
const webpack = require('webpack')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const { CleanWebpackPlugin } = require('clean-webpack-plugin')

function resolve (dir) {
    return path.join(__dirname, '..', dir)
}

config = {
    // 入口文件
    entry: path.join(__dirname, 'src/index.js'),
    
    // 输出文件（打包成一个完整的bundle.js）
    output: {
        filename: '[name].js',
        path: path.join(__dirname, 'dist'),
    },
    resolve: {
        extensions: ['.js', '.vue', '.json'],
        alias: {
          '@': resolve('src'),
          'assets': resolve('src/assets'),
        }
    },
    module: {   //这个节点用于配置所有的第三方模块加载器
        rules: [
            {
                // 检测.vue结尾的文件以vue-loader来解析
                test: /\.vue$/,
                use: [
                    'vue-loader'
                ] 
            },
            {
                test: /\.css$/,
                use: [
                  'style-loader',
                  'css-loader'
                ]
            },  
            {
                test: /\.(gif|jpg|png|svg|jpeg)$/,  
                use: [
                    {
                        loader: 'url-loader',
                        options: {
                            // 只要文件内存不超过1024字节则以base64的形式插入到html中减少http请求
                            limit: false,
                            // [name]为文件名，[ext]为后缀名
                            name: '[name].[ext]',
                            outputPath: 'assets/img/' 
                        }
                    }
                ] 
            },
            {
                test: /\.jsx$/,
                use: 'babel-loader'
            }
        ]
    },
    plugins: [
        new CleanWebpackPlugin(),
        new VueLoaderPlugin(),
        new HtmlWebpackplugin(),
        new webpack.DefinePlugin({
            'process.env': {
                NODE_ENV: isDev ? '"development"' : '"production"'
            }
        }),
        new MiniCssExtractPlugin({
            filename: '[name].css',
            chunkFilename: '[id].css',
            ignoreOrder: false
        })
    ],
    optimization: {
        splitChunks: {
            chunks(chunk) {
                return chunk.name !== 'my-excluded-chunk'
            }
        }
    }
    // devServer: {
    //     port: 8000,
    //     host: '0.0.0.0',
    //     open: true,  // 启动devServer的时候自动打开浏览器
    //     hot: true,   // 某组件代码更新了页面只刷新这个代码，别的不刷新
    //     proxy: {    // 代理规则
    //         '/api': {
    //             target: 'https://xxx.xxx.com',
    //             changeOrigin: true  // 更改请求头中的host和origin
    //         }
    //     }
    // }
}

if (isDev) {
    config.devtool = 'eval-cheap-module-source-map'     //  起到调试代码的作用
    config.module.rules.push({
        test: /\.styl/,
        use: [
            'vue-style-loader',
            'css-loader',
            {
                loader: 'postcss-loader',
                options: {
                    sourceMap: true
                }
            },
            'stylus-loader'
        ]
    })
    config.devServer = {
        overlay: {
            errors: true
        },
        // open: false,  // 启动devServer的时候自动打开浏览器
        hot: true   // 某组件代码更新了页面只刷新这个代码，别的不刷新
    }
    // config.plugins.push(
    //     new webpack.HotModuleReplacementPlugin(),   // 模块热替换，替换、添加或删除 模块，而无需重新加载整个页面
    //     new webpack.NoEmitOnErrorsPlugin()  // 在编译出现错误时，使用 NoEmitOnErrorsPlugin 来跳过输出阶段。这样可以确保输出资源不会包含错误
    // )
} else {
    config.output.filename = '[name].[chunkhash:8].js'
    config.module.rules.push(
        {
            test: /\.styl/,
            use: [
                {
                    loader: MiniCssExtractPlugin.loader,
                    options: {
                        publicPath: './',
                        hmr: process.env.NODE_ENV === 'development'
                    }
                },
                'css-loader',
                {
                    loader: 'postcss-loader',
                    overlay: {
                        errors: true
                    }
                },
                'stylus-loader'
            ]
        }
    )
    config.plugins.push(
        new MiniCssExtractPlugin({
            filename: 'styles.[chunkhash].[name].css',
            chunkFilename: '[id].css',
            ignoreOrder: false
        })
    )
}

module.exports = config